#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

ns_kkymq::MessageManager::ptr mmp;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        mmp = std::make_shared<ns_kkymq::MessageManager>("./data/message/");
        mmp->initQueueMessage("queue1");
    }
    virtual void TearDown() override
    {
        mmp->clear();
    }
};

// 新增消息测试：新增消息，观察可获取的消息数量，以及持久化消息数量
TEST(messages_test, insert_test)
{
    ns_kkymq::BasicProperties properties;
    properties.set_id(ns_kkymq::UUIDHelper::uuid());
    properties.set_delivery_mode(ns_kkymq::DeliveryMode::DURABLE);
    properties.set_routing_key("news.music.pop");
    mmp->insert("queue1", &properties, "Hello World-1", ns_kkymq::DeliveryMode::DURABLE);
    mmp->insert("queue1", nullptr, "Hello World-2", ns_kkymq::DeliveryMode::DURABLE);
    mmp->insert("queue1", nullptr, "Hello World-3", ns_kkymq::DeliveryMode::DURABLE);
    mmp->insert("queue1", nullptr, "Hello World-4", ns_kkymq::DeliveryMode::DURABLE);
    mmp->insert("queue1", nullptr, "Hello World-5", ns_kkymq::DeliveryMode::UNDURABLE);
    ASSERT_EQ(mmp->total_count("queue1"), 4);
    ASSERT_EQ(mmp->durable_count("queue1"), 4);
    ASSERT_EQ(mmp->getable_count("queue1"), 5);
    ASSERT_EQ(mmp->waitack_count("queue1"), 0);
}

// 删除消息测试：确认一条消息，查看持久化消息数量，待确认消息数量
TEST(message_test,delete_test)
{
    ASSERT_EQ(mmp->getable_count("queue1"),5);
    ns_kkymq::MessagePtr msg1 = mmp->front("queue1");
    ASSERT_NE(msg1.get(),nullptr);
    ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));

    ASSERT_EQ(mmp->getable_count("queue1"),4);
    ASSERT_EQ(mmp->waitack_count("queue1"),1);
    mmp->ack("queue1",msg1->payload().properties().id());
    ASSERT_EQ(mmp->waitack_count("queue1"),0);
    ASSERT_EQ(mmp->durable_count("queue1"),3);
    ASSERT_EQ(mmp->total_count("queue1"),4);

}

// ns_kkymq::MessageManager::ptr mmp1;

// class MessageTest2 : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//         mmp1 = std::make_shared<ns_kkymq::MessageManager>("./data/message/");
//     }
//     virtual void TearDown() override
//     {
//         // mmp1->clear();
//     }
// };
// 恢复历史数据测试
// TEST(message_test, recovery_test)
// {
//     mmp1->initQueueMessage("queue1");
//     ASSERT_EQ(mmp1->getable_count("queue1"), 3);
//     // ns_kkymq::MessagePtr msg1 = mmp1->front("queue1");
//     // ASSERT_NE(msg1.get(), nullptr);
//     // ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));

//     // ns_kkymq::MessagePtr msg2 = mmp1->front("queue1");
//     // ASSERT_EQ(msg2->payload().body(), std::string("Hello World-2"));

//     // ns_kkymq::MessagePtr msg3 = mmp1->front("queue1");
//     // ASSERT_EQ(msg3->payload().body(), std::string("Hello World-3"));

//     // ns_kkymq::MessagePtr msg4 = mmp1->front("queue1");
//     // ASSERT_EQ(msg4->payload().body(), std::string("Hello World-4"));
//     // ASSERT_EQ(mmp1->getable_count("queue1"), 0);
// }

// 获取消息测试：获取一条消息，然后在不进行确认的情况下，查看可获取消息数量，待确认消息数量，以及测试消息获取顺序
// TEST(message_test, select_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"),5);
//     //front的内部实现是会删除头数据
//     ns_kkymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_NE(msg1.get(),nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));

//     ns_kkymq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_EQ(msg2->payload().body(), std::string("Hello World-2"));

//     ns_kkymq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_EQ(msg3->payload().body(), std::string("Hello World-3"));

//     ns_kkymq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_EQ(msg4->payload().body(), std::string("Hello World-4"));

//     ns_kkymq::MessagePtr msg5 = mmp->front("queue1");
//     ASSERT_NE(msg5.get(), nullptr);

//     ASSERT_EQ(mmp->getable_count("queue1"),0);
// }


// 销毁测试
TEST(message_test,clear_test)
{
    mmp->destroyQueueMessage("queue1");
}
int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    // testing::AddGlobalTestEnvironment(new MessageTest2);
    RUN_ALL_TESTS();
    return 0;
}